package queue_stack.leetcode;

import java.util.ArrayDeque;
import java.util.Deque;

/**
 * @author yuisama
 * @date 2022年11月21日 12:05
 * @description 栈的压入/弹出序列
 */
public class Offer31_ValidStackSeq {
    // 关键 : 给定一个栈的压入和弹出序列，则此时栈的push和pop操作是唯一且确定的
    public boolean validateStackSequences(int[] pushed, int[] popped) {
        Deque<Integer> stack = new ArrayDeque<>();
        // 当前走到popped数组的哪个下标
        int i = 0;
        // 将pushed元素入栈
        for (int num : pushed) {
            stack.push(num);
            // 当栈顶元素与当前popped数组元素相同，直接出栈
            while (!stack.isEmpty() && stack.peek() == popped[i]) {
                stack.pop();
                i ++;
            }
        }
        // 当整个入栈出栈操作结束，栈不为空说明弹出序列有误
        return stack.isEmpty();
    }
}
